import { CallHandler, ExecutionContext, Injectable, Logger, NestInterceptor } from '@nestjs/common';
import { Observable, tap } from 'rxjs';

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
  private readonly logger = new Logger('HTTP');

  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    const request = context.switchToHttp().getRequest();
    const startTime = Date.now();

    this.logRequest(request, startTime);

    return next.handle().pipe(
      tap((response) => {
        const duration = Date.now() - startTime;
        this.logResponse(request, response, duration);
      })
    );
  }

  private logRequest(request: any, startTime: number) {
    const { method, url, ip, params, query, body } = request;
    this.logger.log(`
┏━━━━━━━━━━━━ HTTP 请求日志 ━━━━━━━━━━━━
┣ 请求时间：          ${new Date(startTime).toISOString()}
┣ 请求方式：          ${method}
┣ 请求地址：          ${url}
┣ 客户端 IP：        ${ip}
┣ 请求参数：          ${JSON.stringify(params)}
┣ 查询参数：          ${JSON.stringify(query)}
┣ 请求 Body：        ${JSON.stringify(body)}
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━
    `);
  }

  private logResponse(request: any, response: any, duration: number) {
    this.logger.log(`
┏━━━━━━━━━━━━ HTTP 响应日志 ━━━━━━━━━━━━
┣ 响应时间：          ${new Date().toISOString()}
┣ 请求方式：          ${request.method}
┣ 请求地址：          ${request.url}
┣ 响应状态码：        ${response?.statusCode || 'N/A'}
┣ 响应耗时：          ${duration}ms
┣ 响应数据：          ${JSON.stringify(response)}
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    `);
  }
}
